package com.xhrd.generator.provider.db.sql.model;

import com.xhrd.generator.provider.db.table.model.Column;
import com.xhrd.generator.util.StringHelper;
import com.xhrd.generator.util.typemapping.JavaPrimitiveTypeMapping;

public class SqlParameter extends Column {
        String parameterClass;
//    	int parameterMode;
//    	int parameterType;
//    	String parameterTypeName;
//    	int precision; //no use
//    	int scale; //no use
        String paramName;
        boolean isListParam = false;

        public SqlParameter() {}

        public SqlParameter(Column param) {
            super(param);
        }

        public SqlParameter(SqlParameter param) {
            super(param);
            this.isListParam = param.isListParam;
            this.paramName = param.paramName;

//    		this.parameterClassName = param.parameterClassName;
//    		this.parameterMode = param.parameterMode;
//    		this.parameterType = param.parameterType;
//    		this.parameterTypeName = param.parameterTypeName;
//    		this.precision = param.precision;
//    		this.scale = param.scale;
        }

//    	public SqlParameter(ParameterMetaData m,int i) throws SQLException {
//    		this.parameterClassName = m.getParameterClassName(i);
//    		this.parameterMode = m.getParameterMode(i);
//    		this.parameterType = m.getParameterType(i);
//    		this.parameterTypeName = m.getParameterTypeName(i);
//    		this.precision = m.getPrecision(i);
//    		this.scale = m.getScale(i);
//    	}

        public String getParameterClass() {
            if(StringHelper.isNotBlank(parameterClass)) return parameterClass;
            return getSimpleJavaType();
        }

        public String getPrimitiveParameterClass() {
            if(StringHelper.isNotBlank(parameterClass)) return JavaPrimitiveTypeMapping.getPrimitiveType(parameterClass);
            return getPrimitiveJavaType();
        }

        public void setParameterClass(String parameterClass) {
            this.parameterClass = parameterClass;
        }

        public String getPreferredParameterJavaType() {
            return toListParam(getParameterClass());
        }

        public String getPreferredPrimitiveParameterJavaType() {
            return toListParam(getPrimitiveParameterClass());
        }

        private String toListParam(String parameterClassName) {
            if(isListParam) {
                if(parameterClassName.indexOf("[]") >= 0){
                    return parameterClassName;
                }
                if(parameterClassName.indexOf("List") >= 0){
                    return parameterClassName;
                }
                if(parameterClassName.indexOf("Set") >= 0){
                    return parameterClassName;
                }
                return "java.util.List<"+parameterClassName+">";
            }else {
                return parameterClassName;
            }
        }
//		public int getParameterMode() {
//			return parameterMode;
//		}
//		public void setParameterMode(int parameterMode) {
//			this.parameterMode = parameterMode;
//		}
//		public int getParameterType() {
//			return parameterType;
//		}
//		public void setParameterType(int parameterType) {
//			this.parameterType = parameterType;
//		}
//		public String getParameterTypeName() {
//			return parameterTypeName;
//		}
//		public void setParameterTypeName(String parameterTypeName) {
//			this.parameterTypeName = parameterTypeName;
//		}
//		public int getPrecision() {
//			return precision;
//		}
//		public void setPrecision(int precision) {
//			this.precision = precision;
//		}
//		public int getScale() {
//			return scale;
//		}
//		public void setScale(int scale) {
//			this.scale = scale;
//		}
        /**
         * 参数名称
         */
        public String getParamName() {
            return paramName;
        }
        public void setParamName(String paramName) {
            this.paramName = paramName;
        }
        /**
         * 是否是列表参数,主要是in语句,如 username in (:usernames) 则为true, username = :username则false
         * @return
         */
        public boolean isListParam() {
            return isListParam;
        }
        public void setListParam(boolean isListParam) {
            this.isListParam = isListParam;
        }

        public boolean equals(Object obj) {
            if(obj == this) return true;
            if(obj == null) return false;
            if(obj instanceof SqlParameter) {
                SqlParameter other = (SqlParameter)obj;
                return paramName.equals(other.getParamName());
            }else {
                return false;
            }
        }
        public int hashCode() {
            return paramName.hashCode();
        }
        public String toString() {
            return "paramName:"+paramName+" preferredParameterJavaType:"+getPreferredParameterJavaType();
        }
    }